/**
 * @description 工具函数
 * @author 任一鸣
 */
import { message } from 'ant-design-vue'

// 上传前检查（文件类型和文件大小）
// ['image/jpeg', 'image/png']
// 此写法扩展性差，需拆分
// export const beforeUploadCheck = (file: File, formatArr: string[], size: number) => {
//   // MIME 媒体文件类型 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types
//   if (!formatArr.includes(file.type)) {
//     return false
//   }
//   if (file.size / 1024 / 1024 > size) {
//     return false
//   }
//   return true
// }

// 上传文件验证条件结构
interface CheckCondition {
  types?: string[];  // 上传文件限制类型
  size?: number;  // 限制上传大小 m 为单位
}

type UploadErrorType = 'type' | 'size' | null
// 将通用验证和定制内容拆分
// 通用验证（不包含任何交互内容，只做逻辑判断）
export const beforeUploadCheck = (file: File, { types, size }: CheckCondition) => {
  const isValidType = types ? types.includes(file.type) : true
  const isValidSize = size ? (file.size / 1024 / 1024 <= size) : true
  let error: UploadErrorType = null
  if (!isValidType) {
    error = 'type'
  }
  if (!isValidSize) {
    error = 'size'
  }
  return {
    isPassed: isValidType && isValidSize,
    error
  }
}

/**
 * 通用的图片上传验证
 * @param file
 */
export const commonUploadCheck = (file: File) => {
  const types = ['image/jpeg', 'image/png']
  const size = 1
  const { isPassed, error } = beforeUploadCheck(file, { types, size })
  if (error === 'type') {
    message.error('上传图片必须是 JPG/PNG 格式！')
  }
  if (error === 'size') {
    message.error('上传的图片大小不能超过 1Mb！')
  }
  return isPassed
}

/**
 * 通过图片 src 获取图片在未设置width height之前的自然宽高
 * @param src 可以是图片 url 地址 | 也可以是一个 File 对象
 */
export const getImageDimensions = (src: string | File) => {
  return new Promise<{ width: number; height: number }>((resolve, reject) => {
    const image = new Image()
    image.src = typeof src === 'string' ? src : URL.createObjectURL(src)
    image.addEventListener('load', () => {
      const { naturalWidth: width, naturalHeight: height } = image  // 获取image在未设置width height之前的自然宽高
      resolve({ width, height })
    })
    image.addEventListener('error', () => {
      reject(new Error('图片加载失败'))
    })
  })
}